在前一篇文章中,列了一些插值器,包括颜色的、尺寸的等等,但他们都是线性的,也就是说,他们在执行事件内,都是以匀速计算的,假如我们需要一些特殊的效果,譬如先快后慢之类的效果,该怎么办呢?

这里就用到了 Curved,它内部封装了一些不同效果的插值器,运用这些非线性插值器,可以帮助我们实现更丰富的动画效果,使用起来也很简单,直接创建一个 CurvedAnimation 对象,然后将插值器传入即可:

class AnimationRouteState extends State<AnimationRoute>
    with TickerProviderStateMixin {
  AnimationController animationController;
  Animation animation;
  Color backgroundColor;

  @override
  void initState() {
    super.initState();
    animationController = new AnimationController(
        vsync: this, duration: Duration(milliseconds: 1000), debugLabel: "测试");
    CurvedAnimation curvedAnimation = CurvedAnimation(parent: animationController, curve: Curves.easeIn);
    animation = ColorTween(begin: Colors.red, end: Colors.lightGreen)
        .animate(curvedAnimation);
    animationController.addListener(() {
      setState(() {});
      backgroundColor = animation.value;
      if(curvedAnimation.isCompleted){
        animationController.repeat(reverse: true);
      }
    });
    // 开始播放动画
    animationController.forward();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text('动画'),
      ),
      body: Container(
        alignment: Alignment.center,
        child: Container(
          width: 400,
          color: backgroundColor,
          height: 400,
        ),
      ),
    );
  }

  @override
  void dispose() {
    super.dispose();
    // 动画使用完成后必需要销毁
    animationController.dispose();
  }
}

效果就不上了,在上面的例子中,插值器使用的是 Curves.easeIn,Flutter 中内置了多种常用变化曲线:

  • linear,线性的,和 Tween 一样
  • decelerate,匀减速
  • ease,开始加速,后面减速
  • easeIn,开始慢,后面快
  • easeOut,开始快,后面慢
  • easeInOut,开始慢,然后加速,最后再减速
  • fastOutSlowIn,快出慢进
  • bounceIn,进入反弹
  • bounceOut,退出反弹
  • bounceInOut,进出反弹
  • elasticIn,弹性进入
  • elasticOut,弹性退出
  • elasticInOut,弹性进出

这些曲线效果可以看这里 Curves-class

如果这些还不能满足我们的使用,还可以自己创建:

class MyCurve extends Curve {
  @override
  double transform(double t) {
    return math.sin(t * math.PI * 2);
  }
}

results matching ""

    No results matching ""